{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We learned usage of RDKit - a python library for cheminformatics. <br>\n",
    "In this tutorial, we will use a support vector regression (SVR) to predict logP (partition coefficeint). <br>\n",
    "The input - structural feature of molecules is Morgan fingerprint and the eoutput is logP. <br>\n",
    "\n",
    "At first, import necessary libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from rdkit import Chem\n",
    "from rdkit.Chem.Crippen import MolLogP\n",
    "from rdkit import Chem, DataStructs\n",
    "from rdkit.Chem import AllChem\n",
    "from sklearn.svm import SVR\n",
    "from sklearn.metrics import mean_squared_error, r2_score\n",
    "from scipy import stats\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "I prepared the SMILES of molecules in ZINC dataset. \n",
    "You can download more data from ZINC database - http://zinc.docking.org/\n",
    "\n",
    "Obtain the molecular fingerprint and logP values from RDKit. <br>\n",
    "You can see more detail usage of RDKit in a 'RDKit Cookbook' - https://www.rdkit.org/docs/Cookbook.html."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "num_mols = 20000\n",
    "f = open('smiles.txt', 'r')\n",
    "contents = f.readlines()\n",
    "\n",
    "fps_total = []\n",
    "logP_total = []\n",
    "\n",
    "for i in range(num_mols):\n",
    "    smi = contents[i].split()[0]\n",
    "    m = Chem.MolFromSmiles(smi)\n",
    "    fp = AllChem.GetMorganFingerprintAsBitVect(m,2)\n",
    "    arr = np.zeros((1,))\n",
    "    DataStructs.ConvertToNumpyArray(fp,arr)\n",
    "    fps_total.append(arr)\n",
    "    logP_total.append(MolLogP(m))\n",
    "    \n",
    "fps_total = np.asarray(fps_total)\n",
    "logP_total = np.asarray(logP_total)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then split the total dataset to a training and test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 4000, 1000)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_total = fps_total.shape[0]\n",
    "num_train = int(num_total*0.8)\n",
    "\n",
    "num_total, num_train, (num_total-num_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fps_train = fps_total[0:num_train]\n",
    "logP_train = logP_total[0:num_train]\n",
    "fps_test = fps_total[num_train:]\n",
    "logP_test = logP_total[num_train:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will use a SVR model for a regression model. <br>\n",
    "Documentation is in here - http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html. <br>\n",
    "In this case, we will use a polynomial kernel and coefficients of the kernel as 5.0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma=5.0,\n",
       "  kernel='poly', max_iter=-1, shrinking=True, tol=0.001, verbose=False)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_gamma = 5.0\n",
    "clf = SVR(kernel='poly', gamma=_gamma)\n",
    "clf.fit(fps_train, logP_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After finish training, we should check the accuracy of our prediction. <br>\n",
    "For evaluation, we will use r2 and mean squared error for metrics."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.75989553747443306, 0.40089623135693314)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "logP_pred = clf.predict(fps_test)\n",
    "r2 = r2_score(logP_test, logP_pred)\n",
    "mse = mean_squared_error(logP_test, logP_pred)\n",
    "r2, mse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can visualize the results from the model. <br> \n",
    "Plot (True values - Predicted values), and also linear regression between them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nbhYsWEDPnj19vovt27ezceNGOnXqxDPPPOO1zOHDh1m4cCFvv/02ERER/PnPf+axxx7jrrvu8lr+\nxIkTzJgxg/Xr13PRRRcxdepUFi9ezIwZM7jlllvYvHkzvXv35oYbbvB6f1lZGQcOHODCCy/02e66\ncDqdREVFme+qV69ePjv09957j1mzZnHgwAFeeukl8x6DvXv38vHHHzN8+PAGt6elk5GR4fZvKNKi\nBCFYnDx50hwpJSUlMXPmTL744gv69OnDiBEjANiyZQu7du3i8ssvB6CyspKRI0dSUlJCTEwM/fr1\nA2pszIsXL671jHfeeYfnnnsOqPFZdO3atZZNfe3ataxdu5ahQ4cCcPz4cXbv3s2xY8e4+uqrzZFz\nenq63+/z7bffcvToUVJSUoCakeP111/P0aNHOXbsGKNGjQJgypQpvP766+Z9mzZtYujQobRp04a5\nc+cycKC7kHbp0sUUr0BRVVXFpk2b2L59O71792bSpEksXbqUmTNn8sADD3DuuedSWVnJ7NmzefDB\nB7n33nt56qmnOHDgAKdOneLee++t8xlXXnklnTp18lvmvffeY9euXea7qaysZPTo0T7Lf/LJJ/Tr\n14+LLroIqBHgJUuWMGLECOLi4ujTpw8AkydPNn/vAC+++CIbNmygQ4cOPPPMM3Tr1s2t3uLiYm66\n6SYAvvzySzp27Gj6hdavX+9WXmtdq12+ooJGjRrFzp072blzJzNmzGDChAl06NABgO+++45rr72W\nJ554gjPOOMPve2rNREVFmTP5UKVFCYLdkXygMXwInkRGRpo/a60ZN24cy5cvdytTXFwcsNA8rTV3\n3nknN998s9v1Rx99NCDP8NaBWElKSnITCE/qO0M455xzOHToEOeddx6HDh1y8w0Y9OrVi6FDh5oj\n5auuuootW7Ywc+ZMc3bRsWNHMjIyzI5RKUXfvn3NjrMurL/Hdu3aufmDjBh7rTUTJkzg+eeft1Wn\nr3dZ1zueOnUqjz76qM/Prc7ze+65h/j4eG688UavZc8++2zKy8s5deoUbdu25eDBg35nSgADBw6k\nQ4cO7Nq1i8TERCorK7nmmmu46aab6hxoCKFP0HwISqlOSqn3lVL/UUrtVEo1PiwlhBkxYgSbN2+m\nrKwMqDEZfPrpp8THx7Nv3z7T3u4pGAZjx47l6aefBmpsv9999x1dunTh2LFjZpmf//znPPvss6Zv\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x961ad68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "slope, intercept, r_value, p_value, std_error = stats.linregress(logP_test, logP_pred)\n",
    "yy = slope*logP_test+intercept\n",
    "plt.scatter(logP_test, logP_pred, color='black', s=1)\n",
    "plt.plot(logP_test, yy, label='Predicted logP = '+str(round(slope,2))+'*True logP + '+str(round(intercept,2)))\n",
    "plt.xlabel('True logP')\n",
    "plt.ylabel('Predicted logP')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In summary, we use a SVR model for prediction of logP. <br>\n",
    "With prepared dataset, we can easily preprocess, construct the model and validated the results. <br>\n",
    "I hope that students became more accustomed to using RDKit, machine learning models and its visualizations. <br>\n",
    "Don't fear for familiar with data science. Just searching what functions are necessary and use it. I ensure that trials and errors are the best teacher."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
